From fd3c09b0299e379578fc5d4b9bb58db5c0508335 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Sat, 29 Nov 2008 09:07:52 +0000 Subject: [PATCH] x86: Fix PHYSDEVOP_pirq_eoi_mfn, which I modified and broke. Signed-off-by: Keir Fraser --- xen/arch/x86/physdev.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/xen/arch/x86/physdev.c b/xen/arch/x86/physdev.c index 5e3c39a77c..e468d62f5c 100644 --- a/xen/arch/x86/physdev.c +++ b/xen/arch/x86/physdev.c @@ -202,7 +202,6 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg) case PHYSDEVOP_pirq_eoi_mfn: { struct physdev_pirq_eoi_mfn info; - unsigned long *p; BUILD_BUG_ON(NR_IRQS > (PAGE_SIZE * 8)); @@ -216,16 +215,23 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg) PGT_writable_page) ) break; - ret = -ENOSPC; - if ( (p = map_domain_page_global(info.mfn)) == NULL ) + if ( cmpxchg(&v->domain->arch.pirq_eoi_map_mfn, 0, info.mfn) != 0 ) + { + put_page_and_type(mfn_to_page(info.mfn)); + ret = -EBUSY; break; + } - ret = -EBUSY; - if ( cmpxchg(&v->domain->arch.pirq_eoi_map, NULL, p) != NULL ) - unmap_domain_page_global(p); - else - v->domain->arch.pirq_eoi_map_mfn = info.mfn; + v->domain->arch.pirq_eoi_map = map_domain_page_global(info.mfn); + if ( v->domain->arch.pirq_eoi_map == NULL ) + { + v->domain->arch.pirq_eoi_map_mfn = 0; + put_page_and_type(mfn_to_page(info.mfn)); + ret = -ENOSPC; + break; + } + ret = 0; break; } -- 2.30.2